﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Configuration;

namespace Cliente
{
    class Program
    {
        public static string rutaCarpetaArchivos = (ConfigurationManager.AppSettings["DireccionContenidoArchivos"]);
        static void Main(string[] args)
        {
            bool exit = false;
            IPAddress ipMultiCastServ = IPAddress.Parse(ConfigurationManager.AppSettings["ipMultiServidor"]);
            IPAddress ipCliente = IPAddress.Parse(ConfigurationManager.AppSettings["ipCliente"]);
            int puertoMCServ = Int32.Parse(ConfigurationManager.AppSettings["puertoMultiServidor"]);
            int puertoCliente = Int32.Parse(ConfigurationManager.AppSettings["puertoCliente"]);
            Conexion conexion = new Conexion(ipMultiCastServ, ipCliente, puertoMCServ, puertoCliente);

            while (!exit)
            {
                GetHelp();
                Console.WriteLine("Ingresar comando\n");
                string cmd = Console.ReadLine();
                Servidor servidorAConectar;
                bool sigue = true;
                switch (cmd)
                {
                    case "subir_archivo":
                        string rutaArchivo;
                        bool archivoCorrecto = true;
                        do
                        {
                            Console.WriteLine("Ingrese Ruta de archivo a subir: ");
                            rutaArchivo = Console.ReadLine();
                            archivoCorrecto = File.Exists(rutaArchivo) && Path.HasExtension(rutaArchivo);
                            if (!archivoCorrecto) Console.WriteLine("ERROR: Ruta incorrecta o no es un archivo,");
                        } while (!archivoCorrecto);
                        do
                        {
                            servidorAConectar = ConectarServidor(conexion);
                            TransferFile archivoTransf = new TransferFile(rutaArchivo, servidorAConectar, ipCliente, puertoCliente);
                            sigue = !archivoTransf.Subir();
                        } while (sigue);
                        Console.WriteLine("El archivo " + Path.GetFileName(rutaArchivo) + " ha sido cargado con exito.");
                        break;
                    case "bajar_archivo":
                        string archABajar;
                        servidorAConectar = ConectarServidor(conexion);
                        TransferFile transArch = new TransferFile("", servidorAConectar, ipCliente, puertoCliente);
                        List<string> listaArchivos = transArch.ObtenerNombresArchivos();
                        int cont = 1;
                        foreach (string a in listaArchivos)
                        {
                            Console.WriteLine(cont + ")  " + a);
                            cont++;
                        }
                        Console.Write("Elija el numero de uno de los archivos: ");
                        int respuesta = Int32.Parse(Console.ReadLine());
                        archABajar = listaArchivos[respuesta - 1];
                        int continua = 0;
                        do
                        {
                            bool seConecta = (continua > 0);
                            if (seConecta) servidorAConectar = ConectarServidor(conexion);
                            transArch.Ruta = archABajar;
                            continua = transArch.Bajar(continua);
                        } while (continua!=-1);
                        Console.WriteLine("El archivo " + archABajar + " ha sido descargado con exito. Se encuentra en la carpeta Descargas.");
                        break;
                    case "help":
                        Console.WriteLine(GetHelp());
                        break;
                    case "exit":
                        exit = true;
                        break;
                    default:
                        Console.WriteLine(GetHelp());
                        break;
                }
            }

        }
        private static Servidor ConectarServidor(Conexion conexion)
        {
            Servidor servidorAConectar;
            do
            {
                servidorAConectar = conexion.BuscarServidor();
            } while (servidorAConectar == null);
            return servidorAConectar;

        }

        public static string GetHelp()
        {
            string help = "\nComandos:\n\n1)subir_archivo: Permite subir un archivo al servidor\n\n" +
                "2)bajar_archivo: Permite bajar un archivo del Servidor\n\n" +
                "3)exit: Salir del programa\n"
                + "* help: Ayuda";

            return help;

        }
    }
}
